package com.gqr.threadcoreknowledge.stopthreads;

/**
 * 生产实际中 最佳中断实践2: 在catch子语句中调用Thread.currentThread().interrupt()来设置当前线程为中断状态
 * 以便于在后续的执行中，依然能够检查到刚才发生了中断
 * 回到刚才RightWayStopThreadInProd补上中断，让它跳出
 */
public class RightWayStopThreadInProd2 implements Runnable {

    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Interrupted,程序运行结束");
                break;
            }
            reInterrupt();
        }
    }


    // 正确方式把
    private void reInterrupt() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // 设置中断状态
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }
    }

    // 错误方式 使用try/catch
    // 看似try/catch没有任何问题
    // 但是上层的run方法内 业务逻辑没有中断还在不停的运行
    // 相当于异常在子方法里吞住了 没有往上层代码上报
   /* private void reInterrupt() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }*/


    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new RightWayStopThreadInProd2());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
    }
}
